---
title: "Mario Kart Time Trial PBs 150cc"
output:
flexdashboard::flex_dashboard:
orientation: columns
theme: sandstone
navbar:
- { title: "Speedruns", href: "sr.html", align: right}
- { icon: "fas fa-home", href: "index.html", align: right}
favicon: blueshell.png
source_code: embed
---
<script>
$(document).ready(function(){
$('[data-toggle="popover"]').popover();
});
</script>
```{r lib}
library(tidyverse)
library(rvest)
library(plotly)
library(lubridate)
library(knitr)
library(kableExtra)
```
```{r scrapeWRs}
html <- read_html("http://www.mkwrs.com/mk8dx/wrs.php")
ttwr0 <- html %>% html_elements(".wr") %>% html_table() %>% .[[1]]
```
```{r import}
abr <- read_csv("_data/track-abbr.csv")
tt <- read_csv("_data/time-trials.csv",
col_types = cols(total = "c")) %>%
filter(cc == 150) %>%
mutate(
total = ms(total),
yr = year(date),
mth = month(date),
day = day(date),
hour = hour(time),
min = minute(time),
dt = make_datetime(
year = yr,
month = mth,
day = day,
hour = hour,
min = min
)
) %>%
left_join(abr)
ttwr <- ttwr0 %>%
select(track = Track, total = `Time+Video`) %>%
filter(track != "Total:") %>%
distinct() %>%
mutate(total = str_replace_all(total, "'", ":"),
total = str_replace_all(total, "\"", "."),
total = ms(total)) %>%
left_join(abr, by = c("track" = "lss")) %>%
select(trk, total)
```
```{r makeVars}
ttDiff <- tt %>%
arrange(trk, dt) %>%
group_by(trk) %>%
mutate(prev = lag(total), .after = total,
diff = as.double(prev - total, units = "secs"),
diff = replace_na(diff, 0)
) %>%
mutate(cumsum = cumsum(diff), .after = diff)
wk <- ttDiff %>%
filter(!is.na(prev)) %>%
ungroup() %>%
mutate(week = (week(date)-4)) %>%
group_by(week) %>%
summarise(mean = mean(diff), n = n()) %>%
add_row(week=16, mean=0, n=0, .after = 15)
wr <- ttDiff %>%
slice_max(dt) %>%
ungroup() %>%
arrange(trkNO) %>%
left_join(ttwr, by = "trk") %>%
select(date, track, total.x, cumsum, cup, type, total.y) %>%
mutate(diff = as.double(total.x - total.y, units = "secs"))
```
# Tracks 1-48
## Column 1 tbl {data-width="320"}
### Worst Tracks
```{r worst48}
wr %>%
filter(!str_starts(type, "wave")) %>%
select(track, diff) %>%
arrange(desc(diff)) %>%
head(7) %>%
kable(
col.names = c('track' = 'Track',
'diff' = 'WR Diff.')
) %>%
kable_styling()
```
### Best Tracks
```{r best48}
wr %>%
filter(!str_starts(type, "wave")) %>%
select(track, diff) %>%
arrange(diff) %>%
head(7) %>%
kable(
col.names = c('track' = 'Track',
'diff' = 'WR Diff.')
) %>%
kable_styling()
```
### Most Improved since Feb. 2022
```{r mostImprv48}
wr %>%
filter(!str_starts(type, "wave")) %>%
select(track, cumsum) %>%
arrange(desc(cumsum)) %>%
head(7) %>%
kable(
col.names = c('track' = 'Track',
'cumsum' = 'Improvement')
) %>%
kable_styling()
```
## Column 2
### PBs vs WRs
```{r}
wr2 <- wr %>%
filter(!str_starts(type, "wave")) %>%
select(cup, track, date, total.x, total.y, diff)
wr2 %>%
kbl(
col.names = c(" ", "Track", "PB Date", "PB", "WR", "WR Diff"),
align = "c",
escape = FALSE
) %>%
kable_styling(full_width = TRUE) %>%
column_spec(column = 1,
extra_css = 'transform: rotate(270deg);') %>%
column_spec(3:4,
extra_css = 'font-size: 80%;') %>%
column_spec(
6,
color = "white",
background = spec_color(
wr2$diff,
begin = 0.3,
end = 0.7,
alpha = 0.7,
option = "A"
),
popover = paste0("WR: ", wr2$total.y)
) %>%
remove_column(5) %>%
collapse_rows(columns = 1,
row_group_label_position = 'stack') %>%
row_spec(0, align = "c")
```
## Column 2 violin
### PB Time Distributions, Feb 01, 2022 - Present
```{r violin48, fig.height=10}
tt48 <- tt %>%
filter(trkNO <= 48) %>%
mutate(track = fct_reorder(track, trkNO))
ggtt <- tt48 %>%
filter(trk != "dBP") %>%
group_by(track) %>%
mutate(sd = sd(total)) %>%
ungroup() %>%
ggplot(aes(factor(track), total)) +
geom_violin(draw_quantiles = 0.5,
scale = "width",
aes(fill = sd, color=sd),
alpha = .7) +
stat_summary(fun = "median", geom = "point", size = .4) +
scale_fill_gradient(low = "darkcyan", high = "plum") +
scale_color_gradient(low = "darkcyan", high = "plum") +
scale_y_time() +
scale_x_discrete(limits = rev(levels(tt48$track))) +
coord_flip() +
labs(x = "",
y = "PB Time") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45,
hjust = 0.98,
vjust = 0.9),
axis.text = element_text(size = 8),
axis.ticks = element_line(size = .2),
panel.grid = element_line(size = .2),
panel.border = element_rect(fill = NA, size = .2),
legend.position = "none")
ggplotly(ggtt)
```
# Tracks 49-96
## Column 1 tbl {data-width="320"}
### Worst Tracks
```{r worst96}
wr %>%
filter(str_starts(type, "wave")) %>%
select(track, diff) %>%
arrange(desc(diff)) %>%
head(7) %>%
kable(
col.names = c('track' = 'Track',
'diff' = 'WR Diff.')
) %>%
kable_styling()
```
### Best Tracks
```{r best96}
wr %>%
filter(str_starts(type, "wave")) %>%
select(track, diff) %>%
arrange(diff) %>%
head(7) %>%
kable(
col.names = c('track' = 'Track',
'diff' = 'WR Diff.')
) %>%
kable_styling()
```
### Most Improved
```{r mostImprv96}
wr %>%
filter(str_starts(type, "wave")) %>%
select(track, cumsum) %>%
arrange(desc(cumsum)) %>%
head(7) %>%
kable(
col.names = c('track' = 'Track',
'cumsum' = 'Improvement')
) %>%
kable_styling()
```
## Column 2 tbl
### PBs vs WRs
```{r}
PBw <- wr %>%
filter(str_starts(type, "wave")) %>%
select(cup, track, date, total.x, total.y, diff)
PBw %>%
kbl(
col.names = c(" ", "Track", "PB Date", "PB", "WR", "WR Diff"),
align = "c"
) %>%
kable_styling(full_width = TRUE) %>%
column_spec(column = 1,
extra_css = 'transform: rotate(270deg);') %>%
column_spec(3:4,
extra_css = 'font-size: 80%;') %>%
column_spec(
6,
color = "white",
background = spec_color(
PBw$diff,
begin = 0.3,
end = 0.7,
alpha = 0.7,
option = "A"
),
popover = paste0("WR: ", PBw$total.y)
) %>%
remove_column(5) %>%
collapse_rows(columns = 1,
row_group_label_position = 'stack') %>%
row_spec(0, align = "c")
```
## Column 3 violin
### PB Time Distributions, March 18, 2022 - Present
```{r fig.height=10}
tt96 <- tt %>%
filter(trkNO > 48) %>%
mutate(track = fct_reorder(track, trkNO))
gg96tt <- tt96 %>%
group_by(track) %>%
mutate(sd = sd(total)) %>%
ungroup() %>%
ggplot(aes(factor(track), total)) +
geom_violin(draw_quantiles = 0.5,
scale = "width",
aes(fill = sd, color=sd),
alpha = .7) +
stat_summary(fun = "median", geom = "point", size = .4) +
scale_y_time() +
scale_fill_gradient(low = "darkcyan", high = "plum") +
scale_color_gradient(low = "darkcyan", high = "plum") +
scale_x_discrete(limits = rev(levels(tt96$track))) +
coord_flip() +
labs(x = "",
y = "PB Time") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45,
hjust = 0.98,
vjust = 0.9),
axis.text = element_text(size = 8),
axis.ticks = element_line(size = .2),
panel.grid = element_line(size = .2),
panel.border = element_rect(fill = NA, size = .2),
legend.position = "none")
ggplotly(gg96tt)
```
# Overall
## Column 1
### Number of PBs by Week
```{r ggPBwk}
ggN <- wk %>%
ggplot() +
geom_line(aes(x=week, y=n)) +
theme_minimal() +
labs(y = "PBs",
x = "Week")
ggplotly(ggN)
```
### Average Improvement by Week
```{r ggAvgImprv}
ggWk <- wk %>%
ggplot(aes(x=week, y=mean)) +
geom_line() +
theme_minimal() +
labs(x = "Week",
y = "Average Time Save (secs)")
ggplotly(ggWk)
```
### Cumulative Time Save
```{r}
CTS <- ttDiff %>%
ungroup() %>%
filter(!is.na(prev)) %>%
arrange(dt) %>%
mutate(cumsum = cumsum(diff))
ggCTS <- CTS %>%
ggplot(aes(x=dt, y=cumsum)) +
geom_step() +
theme_minimal() +
labs(x="", y="Cumulative Time Saved (secs)") +
theme(axis.text.x = element_text(angle = 90),
legend.position = "none")
ggplotly(ggCTS)
```
## Column 2 {data-width="420"}
### Oldest PBs
```{r old}
wr %>%
select(track, date) %>%
arrange(date) %>%
head(7) %>%
kable(
col.names = c('track' = 'Track',
'date' = 'PB Date')
) %>%
kable_styling()
```
### Largest PBs
```{r}
ttDiff %>%
ungroup() %>%
select(track, date, diff) %>%
arrange(desc(diff)) %>%
head(7) %>%
kable(
col.names = c(
'track' = 'Track',
'date' = 'Date',
'diff' = 'Improvement')
) %>%
kable_styling()
```
### Smallest PBs
```{r}
ttDiff %>%
ungroup() %>%
select(track, date, diff) %>%
filter(diff != 0) %>%
arrange(diff) %>%
head(7) %>%
kable(
col.names = c(
'track' = 'Track',
'date' = 'Date',
'diff' = 'Improvement')
) %>%
kable_styling()
```
## Column 3 {data-width="420"}
### Newest PBs
```{r newest}
ttDiff %>%
ungroup() %>%
select(track, date, diff, dt) %>%
slice_max(dt, n=50) %>%
select(-dt) %>%
kable(
col.names = c(
'track' = 'Track',
'date' = 'Date',
'diff' = 'Improvement')
) %>%
kable_styling()
```